package chen.web.forum;

import java.util.List;

import chen.web.forum.Subject.TopRank;
import chen.web.user.Account;

public interface TopicManager{
	
	/**
	 * 发表主题
	 * @param subject	主题
	 * @throws NotLowestException 
	 */
	Subject post(Subject subject) throws NotLowestException;

	/**
	 * 发表回复
	 * @param reply		回复
	 */
	Reply post(Reply reply);
	
	/**
	 * 删除主题
	 * @param topic
	 */
	void delete(Subject subject);
	
	/**
	 * 删除回复
	 * @param topic
	 */
	void delete(Reply reply);
	
	/**
	 * 恢复主题
	 * @param subject
	 * @param fakeDelete
	 */
	Subject restore(Subject subject);
	/**
	 * 恢复回复
	 * @param reply
	 * @param invisible
	 */
	Reply restore(Reply reply);
	
	
	/**
	 * 安全删除主题，此方法会根据设置来判断是真删除还是假删除.
	 * 若主题还没有审核则会执行真删除
	 * 真删除返回true,假删除返回false
	 * @param subject
	 */
	boolean safeDelete(Subject subject);
	/**
	 * 安全删除回复，此方法会根据设置来判断是真删除还是假删除
	 * 若回复还没有审核则会执行真删除
	 * 真删除返回true,假删除返回false
	 * @param reply
	 */
	boolean safeDelete(Reply reply);
	
	/**
	 * 回复已审核
	 * @param reply
	 */
	Reply checked(Reply reply);
	/**
	 * 主题已审核
	 * @param subject
	 */
	Subject checked(Subject subject);
	
	/**
	 * 更改主题内容
	 * @param subject
	 */
	void update(Subject subject);
	
	/**
	 * 更改回复内容
	 * @param reply
	 */
	void update(Reply reply);
	
	/**
	 * 将主题设为精华, digest为false则取消精华
	 * @param subject
	 * @param digest
	 */
	Subject setDigest(Subject subject, boolean digest);

	/**
	 * 将主题设为置顶
	 * @param subject	
	 * @param rank
	 */
	Subject setTop(Subject subject, TopRank rank);
	
	/**
	 * 取消置顶
	 * @param subject
	 */
	Subject cancelTop(Subject subject);
	
	/**
	 * 隐藏回复内容
	 * @param reply
	 */
	Reply hideReplyContent(Reply reply, boolean hide);
	
	/**
	 * 隐藏主题内容
	 * @param subject
	 */
	Subject hideSubjectContent(Subject subject, boolean hide);
	
	/**
	 * 禁止回复
	 * @param subject
	 */
	Subject forbidReply(Subject subject, boolean forbid);
	
	/**
	 * 移动主题
	 * @param subject
	 * @param category
	 * @return
	 * @throws NotLowestException 
	 */
	Subject move(Subject subject, Category category) throws NotLowestException;
	
	/**
	 * 获取主题
	 * @param subjectid	主题id
	 * @return	主题
	 */
	Subject getSubject(int subjectid);
	
	/**
	 * 获取某个用户的发布回帖数量
	 * @param acc	用户帐号
	 * @return		主题数量
	 */
	int replyAmount(Account acc);
	
	/**
	 * 获取指回复集合
	 * @param condition		条件
	 * @param beginOffset	开始位置
	 * @param count			数量
	 * @return	回复集合
	 */
	List<Reply> getReplyList(ReplyCondition condition, int beginOffset, int count);
	
	/**
	 * 获取指定账号回复过的主题信息集合. 按回复的时间排序
	 * @param account		指定账号
	 * @param beginOffset	开始位置
	 * @param count			数量
	 * @return	主题信息集合
	 */
	List<TopicInfo> getRepliedTopicInfoList(Account account, int beginOffset, int count);
	
	/**
	 * 搜索关键词相关的帖子
	 * @param keywords		关键词
	 * @return		关键词相关的帖子
	 */
	List<Object> search(String keywords);
	
	/**
	 * 增加一次浏览数量
	 */
	void increaseViewCount(Subject subject);
	
	Reply getReply(int replyId);
	
	/**
	 * 获取某个回复的位置，按回复时间正序
	 * @param reply
	 * @return
	 */
	int replyPositionInTopic(Reply reply);
	

	/**
	 * 获取主题信息集合
	 * @param condition	条件
	 * @param beginOffset	开始位置
	 * @param count			数量
	 * @return	主题信息集合
	 */
	List<TopicInfo> getTopicInfoList(SubjectCondition condition, int beginOffset, int count);
	
	/**
	 * 获取指定条件下的主题数量
	 * @param condition	条件
	 * @return	主题数量
	 */
	int totalSubject(SubjectCondition condition);
	
	/**
	 * 获取指定条件下的回复数量
	 * @param condition	条件
	 * @return	主题数量
	 */
	int totalReply(ReplyCondition condition);

}
